#include<iostream>
#include<pthread.h>
#include<unistd.h>
#include<string>
#include<vector>

using namespace std;

void* routine(void* input)
{
    string st((char*)input);
    int cnt = 10;
    while (cnt--)
    {
        cout << st << endl;
        sleep(5);
    }
    return nullptr;
}

int main()
{
    
    // for (size_t i = 0; i < 10; i++)
    // {
    //     char ch[256];
    //     printf("%p\n",ch);
    // }
    // cout << "栈空间地址全部相同,没有新开辟,直接复用了!!!\n";
    // cout << "###############" << endl;
    // for (size_t i = 0; i < 10; i++)
    // {
    //     char* ch = new char[256];
    //     printf("%p\n",ch);
    // }
    // cout << "堆空间地址全部不相同,都是新开辟的!!!\n";
    vector<pthread_t> v;
    v.resize(10);
    for(int i = 0 ; i<10 ; i++ )
    {
        // char ch[256];
        // snprintf(ch,sizeof(ch),"%d 号子线程", i);

        char* ch = new char[256];
        snprintf(ch,256,"%d 号子线程", i);
        pthread_create(&v[i],nullptr,routine,(void*)ch);
    }
    sleep(5);
    for (size_t i = 0; i < 10; i++)
    {
        pthread_join(v[i],nullptr);
    }

    return 0;
}


// // 不能被join的子线程
// void* routine(void* input)
// {
//     pthread_detach(pthread_self());
//     cout << "子线程detach!!!\n";
//     while (true)
//     {
//         cout << "子线程仍在运行...\n";
//         sleep(1);
//     }
    
// }

// int main(int argc, char const *argv[])
// {
//     pthread_t tid = 0;
//     pthread_create(&tid,nullptr,routine,(void*)"666");

//     sleep(3);
//     if(pthread_join(tid,nullptr) != 0)
//         cout << "等待主线程失败" << endl;

//     return 0;
// }



// class factorial
// {
// public:
//     factorial(int x = 0)
//     :_x(x)
//     {
//     }
//     int process()
//     {
//         return _process(_x);
//     }
// private:
//     int _process(int x)
//     {
//         if(x == 1) return 1;
//         return x * _process(x-1);
//     }
//     int _x;
// };

// class result
// {
// public:
//     result(int ret = 0)
//     :_result(ret)
//     {}
//     int GetResul() {return _result; }
// private:
//     int _result;
// };

// void* work(void* input)
// {
//     result* pret = new result(((factorial*)input)->process());
//     return pret;
// }

// int main()
// {
//     pthread_t tid = -1;

//     factorial* pfa = new factorial(4);
//     pthread_create(&tid,nullptr,work,pfa);

//     void* p = nullptr;
//     pthread_join(tid,&p);

//     cout << "主线程收到结果 : " << ((result*)p)->GetResul() << endl;

//     delete(pfa);
//     delete((result*)p);
//     return 0;
// }







// class task
// {
// public:
//     task(int a = 10 , int b = 50)
//     :_x(a),_y(b)
//     {

//     }
//     int Multiple(){return _x*_y; }
// private:
//     int _x;
//     int _y;
// };

// class result
// {
// public:
//     result(int result=0)
//     :_result(result)
//     {}
//     int GetResult() {return _result; }
// private:
//     int _result;
// };

// void* routine(void* input)
// {
//     sleep(2);
    
//     result* rt = new result(((task*)input)->Multiple());
//     return rt;
// }

// int main()
// {
//     pthread_t pt = 0;
//     task* tk = new task(50,500);
//     pthread_create(&pt , nullptr,routine,(void*)tk);

//     result* p = nullptr;
//     pthread_join(pt,(void**)p);

//     cout << "子线程运行结果: " << p->GetResult() << endl;
//     return 0;
// }

// void* Routine(void* p)
// {
//     int* ret_val = new int(10);
//     pthread_exit((void*)ret_val);
//     while(true)
//     {
//         cout << "新线程运行,id=" << pthread_self() <<  endl;
//         sleep(1);
//     }
//     cout << "新线程退出 , id = " << pthread_self() << endl;
//     return nullptr;
// }
// int main()
// {
//     pthread_t tid = 0; 
//     pthread_create(&tid , nullptr , Routine,(void*)"666" );

//     void* ret = nullptr;
//     while(true)
//     {
//         if(pthread_join(tid,&ret) == 0)
//         {
//             cout << "获取子线程退出信息 : " << *(int*)ret << endl;
//         }
//         sleep(1);
//     }
//     return 0;
// }








// void* Routine(void* p)
// {
//     cout << "新线程创建" << endl;
//     int count = 3;
//     while(count--)
//     {
//         //int a = 1/0;  //子线程出现异常,操作系统发送信号给进程,从而所有线程跟着退出
//         cout << "新线程运行中 , 线程id : " << pthread_self() <<  endl;
//         sleep(1);
//     }
//     cout << "新线程退出 , id = " << pthread_self() << endl;

//     string* ps = new string("我是退出的子线程!!!");
//     return ps;
// }

// int main()
// {
//     pthread_t pd = 0;
//     pthread_t ph = pthread_create(&pd,nullptr,Routine,(void*)"hahaha");
    
//     int count = 10;
//     while(count--)
//     {
//         cout << "主线程运行中, 主线程id = " << pthread_self() << endl;
//         sleep(1);
//     }

//     void** ret = nullptr;
//     pthread_join(pd,ret);
//     cout << "回收子线程资源成功 !! id : " << pd << endl;
//     //cout << (string*)ret << endl;
//     return 0;
// }